package com.nanbei.a12;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @ClassDescription: Cglib 动态代理
 * @JdkVersion: 1.8
 * @Author: libs
 * @Created: 2024/11/18 10:59
 */
public class CglibProxyDemo {
    // 代理是子父的关系， 代理是子类，目标是父类
    // Cglib代理 是重写父类的方法，所以方法不能是final类型
    public static void main(String[] args) {
        CglibTarget cglibTarget = new CglibTarget();
        CglibTarget foo = (CglibTarget) Enhancer.create(cglibTarget.getClass(), new CglibProxy(cglibTarget));
        foo.foo();
    }
}


// 目标类
class  CglibTarget {

    public void foo() {
        System.out.println("Cglib proxy");
    }

}

// 代理类
class CglibProxy implements MethodInterceptor{
    private Object target;

    public CglibProxy(Object target) {
        this.target = target;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("before");

        // Object invoke = method.invoke(target, objects); // 用方法反射调用目标
        //  methodProxy 可以避免反射调用
         Object invoke = methodProxy.invoke(target, objects); // 内部没有用反射 需要目标 (Spring)
        // Object invoke = method.invokeSuper(o, objects); // 内部没有用反射 需要代理
        System.out.println("after");
        return invoke;
    }
}